209 长度最小的子数组
给定一个含有 n
个正整数的数组和一个正整数 target
。
找出该数组中满足其总和大于等于 target
的长度最小的
子数组
[numsl, numsl+1, ..., numsr-1, numsr]
,并返回其长度 **。** 如果不存在符合条件的子数组,返回 0
。
示例 1:
** 输入:**target = 7, nums = [2,3,1,2,4,3] ** 输出:**2 ** 解释:** 子数组 [4,3]
是该条件下的长度最小的子数组。
示例 2:
** 输入:**target = 4, nums = [1,4,4] ** 输出:**1
示例 3:
** 输入:**target = 11, nums = [1,1,1,1,1,1,1,1] ** 输出:**0
ts
function minSubArrayLen(target: number, nums: number[]): number {
const n = nums.length;
let ans = n + 1;
let sum = 0; // 子数组元素和
let left = 0; // 子数组左端点
for (let right = 0; right < n; right++) { // 枚举子数组右端点
sum += nums[right];
while (sum - nums[left] >= target) { // 尽量缩小子数组长度
sum -= nums[left++]; // 左端点右移
}
if (sum >= target) {
ans = Math.min(ans, right - left + 1);
}
}
return ans <= n ? ans : 0;
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16